home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / Tools / glimpse-2.1 / agrep / recursive.c < prev    next >
C/C++ Source or Header  |  1995-05-16  |  3KB  |  150 lines

  1. /* Copyright (c) 1994 Sun Wu, Udi Manber, Burra Gopal.  All Rights Reserved. */
  2. /* The function of the program is to traverse the
  3.    direcctory tree and collect paath names.
  4.    This program is derived from the C-programming language book
  5.    Originally, the program open a directory file as a regular file. But
  6.    it won't work. We have to open a directory file using
  7.    opendir system call, and use readdir() to read each entry of the 
  8.    directory.
  9. */
  10.  
  11. #include <stdio.h>
  12. #include <sys/types.h>
  13. #if    DIRENT
  14. #include <dirent.h>
  15. #else    /*DIRENT*/
  16. #include <sys/dir.h>
  17. #endif    /*DIRENT*/
  18. #include <sys/stat.h>
  19. #include <fcntl.h>
  20. #define BUFSIZE 256
  21. #define DIRSIZE 14
  22. #define max_list 10
  23.  
  24. char *file_list[max_list*2];
  25. int  fdx=0; /* index of file_List */
  26. extern int Numfiles;
  27. char name_buf[BUFSIZE];
  28.  
  29. /* returns -1 if error, num of matches >= 0 otherwise */
  30. int
  31. recursive(argc, argv)
  32. int argc;
  33. char **argv;
  34. {
  35.     int i,j;
  36.     int num = 0, ret;
  37.  
  38.     for(i=0; i< argc; i++) {
  39.         strcpy(name_buf, argv[i]);
  40.         treewalk(name_buf);
  41.         if(fdx > 0) {
  42.             Numfiles = fdx;
  43.             if ((ret = exec(3, file_list)) == -1) return -1;
  44.             num += ret;
  45.             for(j=0; j<fdx; j++) {
  46.                 free(file_list[j]);
  47.             }
  48.         }
  49.         fdx = 0;
  50.     }
  51.  
  52.     return num;
  53. }
  54.  
  55.  
  56. /*
  57. main(argc, argv)
  58. int argc; char **argv;
  59. {
  60.     char buf[BUFSIZE];
  61.  
  62.     if (argc == 1) {
  63.         strcpy(buf, ".");
  64.         treewalk(buf);
  65.     }
  66.     else 
  67.         while(--argc > 0) {
  68.             strcpy(buf, *++argv);
  69.             treewalk(buf);
  70.         }
  71. }
  72. */
  73.  
  74.  
  75.  
  76. treewalk(name)
  77. char *name;
  78. {
  79.     struct stat stbuf;
  80.     int i;
  81.     extern void *malloc();
  82.  
  83.     /* printf(" In treewalk\n"); */
  84.     if(lstat(name, &stbuf) == -1) {
  85.         fprintf(stderr, "permission denied or non-existent: %s\n", name);
  86.         return;
  87.     }
  88.     if ((stbuf.st_mode & S_IFMT) == S_IFLNK)  {
  89.         return;
  90.     }
  91.     if (( stbuf.st_mode & S_IFMT) == S_IFDIR) 
  92.         directory(name);
  93.     else {
  94.         file_list[fdx] = (char *)malloc(BUFSIZE);
  95.         strcpy(file_list[fdx++], name);
  96.         /* printf("    %s\n",  name); */
  97.         if(fdx >= max_list) {
  98.             Numfiles = fdx;
  99.             exec(3, file_list);
  100.             for(i=0; i<max_list; i++) free(file_list[i]);
  101.             fdx=0;
  102.         }
  103.  
  104.     }
  105. }
  106.  
  107.  
  108. directory(name)
  109. char *name;
  110. {
  111. #if    DIRENT
  112.     struct dirent *dp;
  113. #else    /*DIRENT*/
  114.     struct direct *dp;
  115. #endif    /*DIRENT*/
  116.     char *nbp;
  117.     DIR *dirp;
  118.     /*
  119.         printf("in directory, name= %s\n",name);
  120.     */
  121.     nbp = name + strlen(name);
  122.     if( nbp+DIRSIZE+2 >= name+BUFSIZE ) /* name too long */
  123.     {
  124.         fprintf(stderr, "name too long: %.32s...\n", name);
  125.         return;
  126.     }
  127.     if((dirp = opendir(name)) == NULL) {
  128.         fprintf(stderr, "permission denied: %s\n", name);
  129.         return;
  130.     }
  131.     *nbp++ = '/';
  132.     *nbp = '\0';
  133.     for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) {
  134.         if (strcmp(dp->d_name, ".") == 0 || strcmp(dp->d_name, "..")==0) 
  135.             goto CONT;
  136.         /*
  137.             printf("dp->d_name = %s\n", dp->d_name);
  138.         */
  139.         strcpy(nbp, dp->d_name);
  140.         treewalk(name);
  141. CONT:
  142.         ;
  143.     }
  144.     closedir (dirp);
  145.     *--nbp = '\0'; /* restore name */
  146. }
  147.  
  148.  
  149.  
  150.